package guigu.IoSystem;

import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/*
一、流的分类：
1. 操作数据单位：字节流、字符流
2. 数据的流向：输入流、输出流
3. 流的角色：节点流、处理流(过滤流)

二、流的体系结构
抽象基类           节点流(或文件流)                               缓冲流(处理流的一种)
InputStream        FileInputStream (read(byte buffer[]))          BufferedInputStream(read(byte buffer[]))
OutputStream       FileOutputStream (write(byte buffer,0,len))    BufferedOutputStream(write(byte buffer,0,len))
Reader             FileReader (read(char cubf[]))                 BufferedReader(read(char cubf[]) / readLine())
Writer             FileWriterTest(write(char cubf[],0,len))      BufferedWriter(write(char cubf[],0,len))

 总结：1.需要用到读写文件时，先清楚是文本文件 or 非文本文件:
           如果是文本文件——使用字符流读写：FileReader (read(char cubf[])) / FileWriterTest(write(char cubf[],0,len))
           如果是非文本文件——使用字节流读写：FileInputStream (read(byte buffer[])) / FileOutputStream (write(byte buffer,0,len))

       2.读写步骤：
         ① 造文件
         ② 造流
         ③ 数据读入：
               字符流： char cubf[] = new char[5];
                        int len;
                        while((len = fr.read(cubf))!=-1)
                        {
                               //正确的写法1
            //                for(int i=0;i<len;i++)
            //                {
            //                    System.out.print(cubf[i]);
            //                }

                             //正确的写法2
                                String str = new String(cubf,0,len);
                                System.out.print(str);
                         }
         ④ 关闭资源
 */
class FileReaderTest {
    /*
    将com.guigu.IO下的hello.txt文件内容读入到内存(程序)中，并输出到控制台

      说明点：
      1.read()的理解：返回读入的一个字符。如果达到文件末尾，返回-1
      2.异常的处理：为了保证流资源一定可以执行关闭操作。需要使用try-catch-finall处理
      3.读入的文件一定要存在，否则就会报FileNotFoundException
     */
    @Test
    public void test1(){
        //1.实例化File类的对象，指明要操作的文件
        FileReader fr = null;
        try {
            File file = new File("hello.txt");
            //2.提供具体的流
            fr = new FileReader(file);
            //3.数据的读入
            //read()：返回读入的一个字符，如果达到文件末尾，返回-1
            int data;
            while((data=fr.read())!=-1)
            {
                System.out.print((char)data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流的关闭操作
            if(fr!=null)
            {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //对read()操作升级，使用read()的重载方法
    @Test
    public void test2(){
        //1.实例化File类的对象，指明要操作的文件
        FileReader fr = null;
        try {
            File file = new File("hello.txt");
            //2.提供输入的流
            fr = new FileReader(file);
            //3.数据的读入
            //read(char cubf[])：返回读入的一个字符，如果达到文件末尾，返回-1
            char cubf[] = new char[5];
            int len;
            while((len = fr.read(cubf))!=-1)
            {
                //方式一
                //错误的写法
//                for(int i=0;i<cubf.length;i++)
//                {
//                    System.out.print(cubf[i]);
//                }
                //正确的写法
//                for(int i=0;i<len;i++)
//                {
//                    System.out.print(cubf[i]);
//                }
                //方式二
                //错误的写法
//                String str = new String(cubf);//数组转换成字符串
//                System.out.print(str);
                //正确的写法
                String str = new String(cubf,0,len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}